package com.yeskery.transfer.core;

import lombok.Getter;
import lombok.Setter;

import java.util.regex.Pattern;
import java.util.stream.IntStream;

/**
 * 操作的结果类
 *
 * @author shuangjiang.du
 * @date 2018-12-13 11:43
 * @version 1.0
 */
@Setter
public class Result implements Output {

	/** 换行符 */
	private static final String NEW_LINE = "\n";

	/** 匹配中文的正则表达式 */
	private static final Pattern PATTERN_CHINESE = Pattern.compile("[\\u4E00-\\u9FA5]|[\\uFE30-\\uFFA0]");

	/** 行宽度 */
	private int length = 36;

	/** 显示的行符号 */
	private String symbol = "-";

	/** 显示的标题 */
	private String title;

	/** 显示的内容 */
	private String content;

	/** 显示的提示语 */
	private String tips;

	@Override
	public String output() {
		StringBuilder contentBuilder = new StringBuilder();
		contentBuilder.append(createBlankLine()).append(NEW_LINE);
		contentBuilder.append(createContentLine(title)).append(NEW_LINE);
		contentBuilder.append(createBlankLine()).append(NEW_LINE);
		contentBuilder.append(content).append(NEW_LINE);
		contentBuilder.append(createBlankLine()).append(NEW_LINE);
		if (tips != null && !tips.isEmpty()) {
			contentBuilder.append(createContentLine(tips)).append(NEW_LINE);
			contentBuilder.append(createBlankLine());
		}
		return contentBuilder.toString();
	}

	/**
	 * 创建一个空行
	 * @return 空行的字符串
	 */
	public String createBlankLine() {
		StringBuilder contentBuilder = new StringBuilder();
		IntStream.range(1, length + 1).forEach(i -> contentBuilder.append(symbol));
		return contentBuilder.toString();
	}

	/**
	 * 根据内容创建一个带符号的行
	 * @param content 提示内容
	 * @return 该行的字符串内容
	 */
	public String createContentLine(String content, Color color) {
		int count = 0;
		for (char c : content.toCharArray()) {
			//去除手动补位的字符
			if (c == '-') {
				continue;
			}
			if (PATTERN_CHINESE.matcher(String.valueOf(c)).matches()) {
				count += 2;
			} else {
				count++;
			}
		}
		if (count >= length - 1) {
			return getColorContent(content, color);
		}
		int startSymbol = (length - count) / 2;
		int endSymbol = length - count - startSymbol;
		StringBuilder contentBuilder = new StringBuilder();
		IntStream.range(1, startSymbol + 1).forEach(i -> contentBuilder.append(symbol));
		contentBuilder.append(getColorContent(content, color));
		IntStream.range(1, endSymbol + 1).forEach(i -> contentBuilder.append(symbol));
		return contentBuilder.toString();
	}

	/**
	 * 根据内容创建一个带符号的行
	 * @param content 提示内容
	 * @return 该行的字符串内容
	 */
	public String createContentLine(String content) {
		return createContentLine(content, Color.DEFAULT);
	}

	/**
	 * 获取颜色文本内容字符串
	 * @param content 文本内容
	 * @param color 颜色
	 * @return 带颜色的文本内容
	 */
	private String getColorContent(String content, Color color) {
		switch (color) {
			case DEFAULT: return content;
			default: return color.getPrefix() + content + color.getSuffix();
		}
	}

	/**
	 * 结果的颜色类
	 *
	 * @author shuangjiang.du
	 * @date 2018-12-14 10:10
	 * @version 1.0
	 */
	@Getter
	public enum Color {
		/** 默认的颜色 */
		DEFAULT(null, null),
		/** 红色 */
		RED("\033[31m", "\033[0m"),
		/** 绿色 */
		GREEN("\033[32m", "\033[0m"),
		/** 黄色 */
		YELLOW("\033[33m", "\033[0m"),
		/** 蓝色 */
		BLUE("\033[34m", "\033[0m"),
		/** 品红 */
		MAGENTA("\033[35m", "\033[0m"),
		/** 青色 */
		CYAN("\033[36m", "\033[0m");

		/** 前缀 */
		private String prefix;

		/** 后缀 */
		private String suffix;

		/**
		 * 创建一个新的颜色枚举
		 * @param prefix 前缀
		 * @param suffix 后缀
		 */
		Color(String prefix, String suffix) {
			this.prefix = prefix;
			this.suffix = suffix;
		}
	}
}
